<?php
/**
 * PrynLib
 * @copyright 2007-2009 Prynel
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @category libPrynel
 * @package Db
 * @version $Revision: 101 $
 */

/**
 * Classe Spdo
 *
 * Class singleton de PDO
 *
 * @category libPrynel
 * @package Db
 * @version 1.0.2 
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @copyright  2007-2009 Prynel
 *        
 * <code>
 * $sql = Db_Spdo::getInstance();
 * $data = $sql->query('SELECT...');
 * while($result = $data->fetch(PDO::FETCH_ASSOC))
 * {
 *    echo $result['champs'];
 * }
 * // Ou en prepared statement
 * $prep = $sql->prepare('SELECT ...');
 * $prep->execute(array(//binding des variables));
 * while($result = $prepared->fetch(PDO::FETCH_ASSOC))
 * ...
 * </code>
 */
class Db_Spdo
{
	const ERREUR_NO 	= 0;
	const ERREUR_DEBUG 	= 1;
	/**
 	 * Nom d'utilisateur sur serveur
 	 * @var string
 	 */
 	private $bduser;
 	
 	/**
 	 * Pass d'utilisateur sur serveur
 	 * @var string
 	 */
 	private $bdpass;
 	
 	/**
 	 * Nom de la base de donnée
 	 * @var string
 	 */
 	private $bdname;
 	
 	/**
 	 * Nom du  serveur
 	 * @var string
 	 */
 	private $bdserv;
 	
 	/**
 	 * Adresse mail
 	 * @var string
 	 */
 	private $mail;
 	
 	/**
 	 * Compteur de requete
 	 * @var int
 	 */
 	private $count;
 	 	
 	/**
 	 * Résultat de requete
 	 * @var array
 	 */
 	private $resultat;
 	
 	/**
 	 * Type d'affichage des erreurs
 	 *
 	 * @var int
 	 */
 	private $erreur; // 0 = pas d'erreur, 1 = Affichage classique
 	
 	/**
 	 * Requete à effectué
 	 * @var string
 	 */
 	private $requete;
 	
 	/**
 	 * Objet PDO Statement
 	 *
 	 * @var PDOStatement
 	 */
 	private $PDOStatement 		= null;
 	
 	/**
 	 * Instance de la classe
 	 *
 	 * @var Db_Spdo
 	 */
 	private static $instance 	= null;
 	
 	/**
 	 * Instance de PDO
 	 *
 	 * @var PDO
 	 */
 	private $PDOInstance = null;
 	
 	/**
 	 * Constructeur, appel PDO
 	 *
 	 */
	private function __construct()
 	{
 		$bdd = Config::getBddinfo();
 		$this->bduser  	= $bdd->user;
 		$this->bdpass  	= $bdd->pass;
 		$this->bdname  	= $bdd->bdd;
 		$this->bdserv  	= $bdd->host;
 		$this->erreur	= $bdd->error;
 		$this->count   	= 0;
 		try{
 			$this->PDOInstance 	= new PDO('mysql:dbname='.$this->bdname.';host='.$this->bdserv.'',$this->bduser,$this->bdpass);
 		}
 		catch(PDOException $dbex){
 			throw new Util_ExceptionHandler('Erreur d\'instanciation : '.$dbex->getMessage());
 		}
 	}
 	
 	/**
 	 * Retourne une instance de PDO
 	 *
 	 * @return PDO
 	 */
 	public static function getInstance()
 	{
 		if(!isset(self::$instance))
 		{
 			self::$instance = new Db_Spdo();
 		}
 		return self::$instance;
 	}
 	
 	/**
 	 * Execute une requete. 
 	 * Si requete différent de select retourne le nombre de ligne affectée
 	 *
 	 * @param string $query
 	 * @return PDOStatement|int
 	 */
 	public function query($query)
 	{
 		$this->requete 	= $query;
 		if ( preg_match('`^select`i',$query) )
 			$data 	= $this->PDOInstance->query($query);
 		else
 			$data	= $this->PDOInstance->exec($query);
 		if($data !==false)
 		{
 			$this->count++;
 			return $data;
 		}
 		else
 		{
 			$error = $this->PDOInstance->errorInfo();
 			throw new Util_ExceptionHandler('DB Error : '.$error[2]);
 		}
 	}
 	
 	/**
 	 * Prépare une requête à être exécutée.
 	 * Les variables sont notées :nom ou ?
 	 *
 	 * @param string $query
 	 * @param array [$driverOpt]
 	 * @return PDOStatement
 	 */
 	public function prepare($query,$driverOpt=null)
 	{
 		if(isset($driverOpt))
 			$prepared = $this->PDOInstance->prepare($query,$driverOpt);
 		else
 			$prepared = $this->PDOInstance->prepare($query);
 			
 		if($prepared)
 		{
 			$this->count++;
 			return $prepared;
 		}
 		else
 		{
 			$error = $this->PDOInstance->errorInfo();
 			throw new Util_ExceptionHandler('DB Error : '.$error[2]);
 		}
 	}
 	
 	/**
 	 * Retourne la dernière id insérée
 	 *
 	 * @return int
 	 */
 	public function last_id()
 	{
 		return $this->PDOInstance->lastInsertId();
 	}
 	
 	/**
 	 * Retourne le nombre de requête exécutée
 	 *
 	 * @return unknown
 	 */
 	public function getCountRequest()
 	{
 		return $this->count;
 	}
 	
 	/**
 	 * Retourne une erreur
 	 *
 	 * @param array $errorArray
 	 */
	private function error($errorArray)
 	{
 		$msg_erreur = '<h3>Erreur de base de données :</h3>
 		Erreur retournée : <strong>' .$errorArray[2]. '</strong><br />
		Erreur n°' .$errorArray[0]. '<br />
		Page concernée : "' .$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']. '"<br />
		Date : "' .date('d\/m\/Y \- H\hi'). '"<br /><br />
		Infos : <span class="msg_erreur">' .$this->requete. '</span>' . '<br />';
		if($this->erreur == self::ERREUR_NO)
		{
			echo '<div class="error">Une erreur est survenue lors de la communication avec la base de donnée. Veuillez nous excuser pour ce désagrément.</div>';
			exit();
		}
		elseif($this->erreur == self::ERREUR_DEBUG)
		{
			echo $msg_erreur;
			//exit();
		}
		else
		{
			exit();
		}
 	}
}
 ?>